package com.shm.dataValidate;

import com.ruoyi.common.core.domain.entity.Product;
import com.ruoyi.common.enums.ErrorCode;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;

import java.math.BigDecimal;

/**
 * @Author dam
 * @create 2023/9/2 17:14
 */
public class ProductValidate {
    public static void validate(Product product) {
        if (StringUtils.isEmpty(product.getName())) {
            throw new ServiceException("请填写商品名称", ErrorCode.OPERATION_ERROR.getCode());
        } else if (StringUtils.isEmpty(product.getDescription())) {
            throw new ServiceException("请填写商品描述", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getOriginalPrice() == null) {
            throw new ServiceException("请填写商品原价", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getPrice() == null) {
            throw new ServiceException("请填写商品现价", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getProductCategoryId() == null) {
            throw new ServiceException("请选择商品分类", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getFineness() == null) {
            throw new ServiceException("请选择商品成色", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getNumber() == null) {
            throw new ServiceException("请填写商品数量", ErrorCode.OPERATION_ERROR.getCode());
        } else if (StringUtils.isEmpty(product.getUnit())) {
            throw new ServiceException("请填写商品单位", ErrorCode.OPERATION_ERROR.getCode());
        } else if (product.getFunctionalStatus() == null) {
            throw new ServiceException("请选择商品功能状态", ErrorCode.OPERATION_ERROR.getCode());
        }

        if (product.getPrice().compareTo(product.getOriginalPrice()) == 1) {
            throw new ServiceException("商品的销售价格比原价高，请重新填写", ErrorCode.OPERATION_ERROR.getCode());
        }
        if (!validateNumber(product.getPrice())) {
            throw new ServiceException("商品出售价格输入有误，需要是正数且只有两位小数", ErrorCode.OPERATION_ERROR.getCode());
        }
        if (!validateNumber(product.getOriginalPrice())) {
            throw new ServiceException("商品原价输入有误，需要是正数且只有两位小数", ErrorCode.OPERATION_ERROR.getCode());
        }
    }

    /**
     * 校验价格是否符合要求
     * 正数
     * 小数点后面最多只有两位小数
     * @param number
     * @return
     */
    private static boolean validateNumber(BigDecimal number) {
        // 判断是否为正数
        if (number.compareTo(BigDecimal.ZERO) <= 0) {
            return false;
        }

        // 判断小数位数是否超过两位
        BigDecimal fractionalPart = number.remainder(BigDecimal.ONE);
        if (fractionalPart.scale() > 2) {
            return false;
        }

        return true;
    }
}
